package com.example.buttons;



import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import java.util.List;
import java.util.Stack;

/**
 * Android中Activity的启动模式有四种，分别是standard模式、singleTop模式、singleTask模式和singleInstance模式。
 *
 * standard模式是Activity的默认启动模式，每当一个新的Activity启动都会进入任务栈，且处于栈的顶部的位置。
 * 所以一个程序有多个Activity需要多次返回才能退出程序。
 *
 * singleTop模式与standard模式相似，当启动一个Activity时，如果该Activity已经位于栈的顶部就不创建，直接使用。
 *
 * singleTask模式，每次启动同一个Activity时，系统首先会检查栈中是否已经存在该Activity的实例，
 * 如果存在就直接使用，并把该Activity之上的所有Activity都出栈，没有发现就新建一个事例。
 *
 * singleInstance模式，在整个系统栈中只有一个实例，每当启动一个新Activity时，
 * 系统会检查栈中是否存在该Activity的事例，如果存在就直接使用，否则就会在新的栈中创建该Activity实例，
 * 并让多个应用共享该栈中的该Activity实例。
 */
public class MainActivity extends AppCompatActivity {

    Button button1;
    Button button2;

    Button button3;

    Button button4;

    Button button5;

    public static final String TAG = "MainActivity";
    ActivityResultLauncher<Intent> launcher = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = findViewById(R.id.btn1);
        button2 = findViewById(R.id.btn2);
        button3 = findViewById(R.id.btn3);
        button4 = findViewById(R.id.btn4);
        button5 = findViewById(R.id.btn5);


        String weather = getString(R.string.weather);
        Log.d(TAG, "onCreate: "+weather);

        PackageManager packageManager = getPackageManager();
        try {
            ActivityInfo activityInfo = packageManager.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
            Bundle bundle = activityInfo.metaData;
            String weather1 = bundle.getString("weather");
            Log.d(TAG, "onCreate: "+weather1);
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(e);
        }

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG,"onClick");
                Intent intent = new Intent(MainActivity.this,MainActivity2.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        });


        button1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.d(TAG,"onTouch");
                return false; // 这个位true，那么上面的onclick不会被调用
            }
        });




        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG,"onClick");

                Intent intent = new Intent(MainActivity.this,MainActivity3.class);

                // 在启动一个Activity时，可以通过Intent传递数据，使用Bundle包装需要传递的数据，
                // 通过Intent.putExtras()方法将Bundle添加到Intent中，
                // 然后通过Intent.getExtras()方法获取传递的数据
                Bundle bundle = new Bundle();
                Person p = new Person();
                p.setName("yejing");
                p.setAge(10);
                p.setAddr("guangzhou");
                bundle.putSerializable("p1",p);

                p = new Person();
                p.setName("zhangsan");
                p.setAge(30);
                p.setAddr("shanghai");
                bundle.putSerializable("p2",p);

                intent.putExtras(bundle);



                startActivity(intent);



            }
        });


        button3.setOnClickListener(v->{
            Log.d(TAG,"onClick");

            Intent intent = new Intent(MainActivity.this,MainActivity4.class);

            // 在启动一个Activity时，可以通过Intent传递数据，使用Bundle包装需要传递的数据，
            // 通过Intent.putExtras()方法将Bundle添加到Intent中，
            // 然后通过Intent.getExtras()方法获取传递的数据
            Bundle bundle = new Bundle();
            Person p = new Person();
            p.setName("yejing");
            p.setAge(10);
            p.setAddr("guangzhou");
            bundle.putSerializable("p1",p);

            p = new Person();
            p.setName("zhangsan");
            p.setAge(30);
            p.setAddr("shanghai");
            bundle.putSerializable("p2",p);

            intent.putExtras(bundle);



            // 在Android开发中，如果需要向上一个Activity返回数据，可以使用以下方法：
            //
            //startActivityForResult() 。通过这个方法可以启动另外一个Activity，当这个Activity结束时，原Activity会收到一个结果。
            //onBasePressed() 。使用这个方法在Activity中点击返回键，可以返回数据到上一个Activity。
            //onActivityResult() 。在需要接收返回数据的Activity中重写这个方法，可以接收到返回的数据。

            startActivityForResult(intent,999);

        });

        button4.setOnClickListener(v->{
            Log.d(TAG,"onClick");

            Intent intent = new Intent(MainActivity.this,MainActivity5.class);
            startActivityForResult(intent,998);
        });

        // registerForActivityResult是startActivityForResult的替换方法1
        launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {

                Log.d(TAG, "onActivityResult: "+result);
                Log.d(TAG, "onActivityResult: addr:"+result.getData().getStringExtra("addr"));

            }
        });

        button5.setOnClickListener(v->{
            Intent intent = new Intent(MainActivity.this,MainActivity6.class);
            launcher.launch(intent);
        });
    }


    /**
     * 处理返回的数据
     * @param requestCode The integer request code originally supplied to
     *                    startActivityForResult(), allowing you to identify who this
     *                    result came from.
     * @param resultCode The integer result code returned by the child activity
     *                   through its setResult().
     * @param data An Intent, which can return result data to the caller
     *               (various data can be attached to Intent "extras").
     *
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult: "+requestCode);
        Log.d(TAG, "onActivityResult: "+resultCode);
        Log.d(TAG, "onActivityResult: "+data);
        if(resultCode == 999){
            Log.d(TAG, "onActivityResult: "+data.getStringExtra("name"));
        }else if(resultCode == 998){
            Log.d(TAG, "onActivityResult: "+data.getIntExtra("age",10));
        }
    }
}